Android by José Enrique Amaro Soriano

Android by José Enrique Amaro Soriano

autor:José Enrique Amaro Soriano
La lengua: spa
Format: epub
Tags: Divulgación, Tecnología
publicado: 2011-10-18T22:00:00+00:00


Figura 14.2. Diálogos de Progreso Horizontal y Giratorio.

14.3. Interfaz Runnable

Existe otro procedimiento alternativo para crear un hilo. Consiste en definir una clase que implemente la interfaz Runnable. Esto requiere definir el método run(), que se ejecutará al iniciarse el hilo mediante:

Thread hilo= new Thread(runnable};

hilo.start();

donde runnable es un objeto de la clase que implementa la interfaz Runnable. La ventaja de este procedimiento en lugar de extender la clase Thread, como hemos hecho en este capítulo, es que cualquier clase puede implementar un interfaz. En particular puede ser una clase que a la vez extienda a la clase View y que podemos insertar en un layout. Así podemos tener varios objetos de tipo View en la pantalla, cada uno asociado a instrucciones que se están ejecutando en su propio hilo. Otra ventaja es que no es necesario utilizar un controlador, pues el contenido de estos objetos View puede ser actualizada continuamente usando el método postInvalidate() de la clase View. Este método hace que se vuelva a dibujar el contenido de un objeto View, ejecutándose el método onDraw()(en este caso no se puede usar invalidate() para dibujar de nuevo, porque este método sólo se puede utilizar en el hilo principal y no en hilos secundarios.)

En el siguiente ejemplo usamos esta técnica para actualizar dos contadores en dos hilos independientes. Cada hilo consiste en un objeto de la clase TextoAnimado que extiende a View y que hemos definido como clase interna. Cada hilo tiene un contador cuyo valor se incrementa con un retraso y se muestra en pantalla. Estos objetos View se añadirán al layout definido en el siguiente fichero main.xml:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:background="#ffffff"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:id="@+id/layout"

>

<TextView

android:id="@+id/texto"

android:textColor="#000000"

android:textSize="35sp"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Interfaz Runnable"

/>

</LinearLayout>

El programa Java, donde definimos la actividad RunnableEjemplo, es el siguiente. Los dos contadores son los elementos de un array. Los parámetros de los objetos TextoAnimado son, además de la clase actual this, el retraso temporal y el índice del contador (0,1).

package es.ugr.amaro.runnableejemplo;

import android.app.Activity;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.os.Bundle;

import android.view.View;

import android.view.ViewGroup.LayoutParams;

import android.widget.LinearLayout;

public class RunnableEjemplo extends Activity {

boolean continuar=true;

String mensaje="";

int[] contador={0,0};

TextoAnimado texto,texto2;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

LinearLayout ll=(LinearLayout)

findViewById(R.id.layout);

LayoutParams params=new LayoutParams(600,100);

texto= new TextoAnimado(this,40,0);

texto.setLayoutParams(params);

ll.addView(texto);

texto2= new TextoAnimado(this,200,1);

texto2.setLayoutParams(params);

texto2.setBackgroundColor(Color.YELLOW);

ll.addView(texto2);

Thread hilo= new Thread(texto);

hilo.start();

Thread hilo2= new Thread(texto2);

hilo2.start();

}

class TextoAnimado extends View implements Runnable{

int retraso;

int i;

Paint paint=new Paint();

public TextoAnimado(Context context,int retraso,int i) {

super(context);

this.retraso=retraso;

this.i=i;

paint.setColor(Color.BLACK);

paint.setTextSize(30);

paint.setAntiAlias(true);

}

@Override

protected void onDraw(Canvas canvas){

super.onDraw(canvas);

canvas.drawText(mensaje,50,50,paint);

}

public void run() {

while(continuar){

try{Thread.sleep(retraso);}

catch(InterruptedException e){;}

contador[i]++;

mensaje="Contador: "+contador[i];

postInvalidate();

}

}

}

}



descargar



Descargo de responsabilidad:
Este sitio no almacena ningún archivo en su servidor. Solo indexamos y enlazamos.                                                  Contenido proporcionado por otros sitios. Póngase en contacto con los proveedores de contenido para eliminar el contenido de derechos de autor, si corresponde, y envíenos un correo electrónico. Inmediatamente eliminaremos los enlaces o contenidos relevantes.